From 51457ad250bef2e7d8a5270a937e8f30c9212aca Mon Sep 17 00:00:00 2001 From: Miles Bader Date: Wed, 6 Dec 2000 05:10:35 +0000 Subject: [PATCH] (frame-set-background-mode): Avoid stomping on locally modified faces. --- lisp/faces.el | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/lisp/faces.el b/lisp/faces.el index 4c59a220ac6..9821be07362 100644 --- a/lisp/faces.el +++ b/lisp/faces.el @@ -1395,13 +1395,26 @@ according to the `background-mode' and `display-type' frame parameters." (frame-parameter frame 'display-type))) (unless (and (eq bg-mode old-bg-mode) (eq display-type old-display-type)) - (modify-frame-parameters frame - (list (cons 'background-mode bg-mode) - (cons 'display-type display-type))) - ;; For all named faces, choose face specs matching the new frame - ;; parameters. - (dolist (face (face-list)) - (face-spec-set face (face-user-default-spec face) frame))))) + (let ((locally-modified-faces nil)) + ;; Before modifying the frame parameters, we collect a list of + ;; faces that don't match what their face-spec says they should + ;; look like; we then avoid changing these faces below. A + ;; negative list is used on the assumption that most faces will + ;; be unmodified, so we can avoid consing in the common case. + (dolist (face (face-list)) + (when (not (face-spec-match-p face + (face-user-default-spec face) + (selected-frame))) + (push face locally-modified-faces))) + ;; Now change to the new frame parameters + (modify-frame-parameters frame + (list (cons 'background-mode bg-mode) + (cons 'display-type display-type))) + ;; For all named faces, choose face specs matching the new frame + ;; parameters, unless they have been locally modified. + (dolist (face (face-list)) + (unless (memq face locally-modified-faces) + (face-spec-set face (face-user-default-spec face) frame))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -- 2.30.2